package com.cskaoyan.javase.exception.handle2.catch2;

/**
 * @description: try...catch单分支捕获并处理异常
 * @author: wuguidong@cskaoyan.onaliyun.com
 **/

import java.util.Scanner;

/**
 * try {
 *  //可能出现异常的，正常的代码逻辑
 * } catch(要捕捉的异常对象) {
 *  //每一个catch分支对应一个异常处理器
 *  //在catch分支中处理具体类型的代码异常
 * }
 * 1，如果程序不产生异常，try catch会怎么执行？
 * 如果程序不产生异常，try中的所有代码正常执行，不会执行catch中的代码
 * 整个程序的执行就好像没有try..catch一样
 * 2，如果程序产生异常：
 *    a，如果产生的异常就是catch代码块中要捕获的异常，那么就会执行catch代码块中的代码。并且try中产生异常之后的代码不执行了 整个try...catch语句之后的代码 仍然会正常执行
 *    所以 整个try代码块中 只可能产生一个异常
 *    并且catch当中只可能捕获一个异常
 *
 *    b，如果产生的异常不是catch所捕获的，那实际上这里产生的异常仍然是默认的处理形式，就会抛给jvm，jvm终止程序然后打印异常信息
 *
 *    c，如果你实在不知道，应该捕获什么异常，你可以使用异常的父类去接收，比如RuntimeException、Exception
 *    但是这种形式不好，因为这样会把每一种异常都作统一处理，这样没有差异性了
 *    所以在捕获异常并处理的代码中，应该写出具体的异常类型，而不是写父类
 *
 *
 * 3，catch当中还可以一次性匹配多个异常
 * 语法：
 * catch(要捕捉的异常类型1 | 要捕捉的异常对类型2 | 要捕捉的异常类型3 对象名...){
 *
 * }
 * 对象名只有一个，因为只可能捕获一个异常
 *
 * > 单分支try...catch使用注意事项
 *
 * - try...catch会显著的影响代码结构，严重影响代码可读性
 *   - 所以应该把尽量少的代码放入try中，最好是产生异常的那一行代码
 *
 * - 如果catch不能匹配异常对象，那么不会执行catch代码块中的内容
 * - 只有当try代码块中产生了异常，catch才有机会执行，没有异常不执行，不匹配也不执行
 * - 当实在不清楚异常的种类时，可以使用Exception接收（但实际上这是偷懒程序员的借口）
 * - **try代码块中某个位置产生了异常，那么try中的代码就不继续执行了**
 *   - 也就是说try当中要么不产生异常，要么**只会产生一个异常**
 *
 */
public class Demo {
    public static void main(String[] args) {
        //接收键盘输入一个int数值
        //System.out.println("请输入一个int数：");
        //Scanner sc = new Scanner(System.in);
        //int a = sc.nextInt();
        int[] arr = {};
        arr = null;
        try {
            System.out.println("before");
            //完全有可能a=0 这里可能产生除0异常
            //System.out.println(10/a);
            System.out.println(arr.length);
            //当代码产生异常 jvm会封装异常信息成一个对象 然后抛出这个对象
            //使用catch就可以接收到这个异常
            //思考：catch代码块中应该写什么？ 应该写对象的引用来接收对象
            System.out.println("after");
        }catch (ArithmeticException | NullPointerException e){
            //只要捕获了catch中写的异常对象，就会执行catch代码块中的代码
            System.out.println("处理除0异常");
        }
        System.out.println("try...catch之后");


    }
}
